home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / CDUNGEON / !CDUNGEON / c / NP3 < prev    next >
Text File  |  1991-05-20  |  10KB  |  493 lines

  1. /* SYNMCH--    SYNTAX MATCHER */
  2.  
  3. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  4. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  5. /* WRITTEN BY R. M. SUPNIK */
  6.  
  7. #include "funcs.h"
  8. #include "vars.h"
  9. #include "parse.h"
  10.  
  11. static void unpack_ P((integer, integer *));
  12. static integer gwim_ P((integer, integer, integer));
  13. static logical syneql_ P((integer, integer, integer, integer, integer));
  14. static logical takeit_ P((integer, integer));
  15.  
  16. /* THIS ROUTINE DETAILS ON BIT 4 OF PRSFLG */
  17.  
  18. logical synmch_()
  19. {
  20.     /* Initialized data */
  21.  
  22. /*   THE FOLLOWING DATA STATEMENT WAS ORIGINALLY: */
  23.  
  24. /*     DATA R50MIN/1RA/ */
  25.  
  26.     const integer r50min = 1600;
  27.  
  28.     /* System generated locals */
  29.     integer i__1;
  30.     logical ret_val;
  31.  
  32.     /* Local variables */
  33.     integer j;
  34.     integer newj;
  35.     integer drive, limit, qprep, sprep, dforce;
  36.  
  37.     ret_val = FALSE_;
  38.     j = pv_1.act;
  39. /*                         !SET UP PTR TO SYNTAX. */
  40.     drive = 0;
  41. /*                         !NO DEFAULT. */
  42.     dforce = 0;
  43. /*                         !NO FORCED DEFAULT. */
  44.     qprep = orphs_1.oflag & orphs_1.oprep;
  45. L100:
  46.     j += 2;
  47. /*                         !FIND START OF SYNTAX. */
  48.     if (vvoc[j - 1] <= 0 || vvoc[j - 1] >= r50min) {
  49.     goto L100;
  50.     }
  51.     limit = j + vvoc[j - 1] + 1;
  52. /*                         !COMPUTE LIMIT. */
  53.     ++j;
  54. /*                         !ADVANCE TO NEXT. */
  55.  
  56. L200:
  57.     unpack_(j, &newj);
  58. /*                         !UNPACK SYNTAX. */
  59.     sprep = syntax_1.dobj & VPMASK;
  60.     if (! syneql_(pv_1.p1, pv_1.o1, syntax_1.dobj, syntax_1.dfl1, 
  61.         syntax_1.dfl2)) {
  62.     goto L1000;
  63.     }
  64.     sprep = syntax_1.iobj & VPMASK;
  65.     if (syneql_(pv_1.p2, pv_1.o2, syntax_1.iobj, syntax_1.ifl1, 
  66.         syntax_1.ifl2)) {
  67.     goto L6000;
  68.     }
  69.  
  70. /* SYNTAX MATCH FAILS, TRY NEXT ONE. */
  71.  
  72.     if (pv_1.o2 != 0) {
  73.     goto L3000;
  74.     } else {
  75.     goto L500;
  76.     }
  77. /*                         !IF O2=0, SET DFLT. */
  78. L1000:
  79.     if (pv_1.o1 != 0) {
  80.     goto L3000;
  81.     } else {
  82.     goto L500;
  83.     }
  84. /*                         !IF O1=0, SET DFLT. */
  85. L500:
  86.     if (qprep == 0 || qprep == sprep) {
  87.     dforce = j;
  88.     }
  89. /*                         !IF PREP MCH. */
  90.     if ((syntax_1.vflag & SDRIV) != 0) {
  91.     drive = j;
  92.     }
  93. L3000:
  94.     j = newj;
  95.     if (j < limit) {
  96.     goto L200;
  97.     }
  98. /*                         !MORE TO DO? */
  99. /* SYNMCH, PAGE 2 */
  100.  
  101. /* MATCH HAS FAILED.  IF DEFAULT SYNTAX EXISTS, TRY TO SNARF */
  102. /* ORPHANS OR GWIMS, OR MAKE NEW ORPHANS. */
  103.  
  104.     if (drive == 0) {
  105.     drive = dforce;
  106.     }
  107. /*                         !NO DRIVER? USE FORCE. */
  108.     if (drive == 0) {
  109.     goto L10000;
  110.     }
  111. /*                         !ANY DRIVER? */
  112.     unpack_(drive, &dforce);
  113. /*                         !UNPACK DFLT SYNTAX. */
  114.  
  115. /* TRY TO FILL DIRECT OBJECT SLOT IF THAT WAS THE PROBLEM. */
  116.  
  117.     if ((syntax_1.vflag & SDIR) == 0 || pv_1.o1 != 0) {
  118.     goto L4000;
  119.     }
  120.  
  121. /* FIRST TRY TO SNARF ORPHAN OBJECT. */
  122.  
  123.     pv_1.o1 = orphs_1.oflag & orphs_1.oslot;
  124.     if (pv_1.o1 == 0) {
  125.     goto L3500;
  126.     }
  127. /*                         !ANY ORPHAN? */
  128.     if (syneql_(pv_1.p1, pv_1.o1, syntax_1.dobj, syntax_1.dfl1, 
  129.         syntax_1.dfl2)) {
  130.     goto L4000;
  131.     }
  132.  
  133. /* ORPHAN FAILS, TRY GWIM. */
  134.  
  135. L3500:
  136.     pv_1.o1 = gwim_(syntax_1.dobj, syntax_1.dfw1, syntax_1.dfw2);
  137. /*                         !GET GWIM. */
  138.     if (pv_1.o1 > 0) {
  139.     goto L4000;
  140.     }
  141. /*                         !TEST RESULT. */
  142.     i__1 = syntax_1.dobj & VPMASK;
  143.     orphan_(- 1, pv_1.act, 0, i__1, 0);
  144.     rspeak_(623);
  145.     return ret_val;
  146.  
  147. /* TRY TO FILL INDIRECT OBJECT SLOT IF THAT WAS THE PROBLEM. */
  148.  
  149. L4000:
  150.     if ((syntax_1.vflag & SIND) == 0 || pv_1.o2 != 0) {
  151.     goto L6000;
  152.     }
  153.     pv_1.o2 = gwim_(syntax_1.iobj, syntax_1.ifw1, syntax_1.ifw2);
  154. /*                         !GWIM. */
  155.     if (pv_1.o2 > 0) {
  156.     goto L6000;
  157.     }
  158.     if (pv_1.o1 == 0) {
  159.     pv_1.o1 = orphs_1.oflag & orphs_1.oslot;
  160.     }
  161.     i__1 = syntax_1.dobj & VPMASK;
  162.     orphan_(- 1, pv_1.act, pv_1.o1, i__1, 0);
  163.     rspeak_(624);
  164.     return ret_val;
  165.  
  166. /* TOTAL CHOMP */
  167.  
  168. L10000:
  169.     rspeak_(601);
  170. /*                         !CANT DO ANYTHING. */
  171.     return ret_val;
  172. /* SYNMCH, PAGE 3 */
  173.  
  174. /* NOW TRY TO TAKE INDIVIDUAL OBJECTS AND */
  175. /* IN GENERAL CLEAN UP THE PARSE VECTOR. */
  176.  
  177. L6000:
  178.     if ((syntax_1.vflag & SFLIP) == 0) {
  179.     goto L5000;
  180.     }
  181.     j = pv_1.o1;
  182. /*                         !YES. */
  183.     pv_1.o1 = pv_1.o2;
  184.     pv_1.o2 = j;
  185.  
  186. L5000:
  187.     prsvec_1.prsa = syntax_1.vflag & SVMASK;
  188.     prsvec_1.prso = pv_1.o1;
  189. /*                         !GET DIR OBJ. */
  190.     prsvec_1.prsi = pv_1.o2;
  191. /*                         !GET IND OBJ. */
  192.     if (! takeit_(prsvec_1.prso, syntax_1.dobj)) {
  193.     return ret_val;
  194.     }
  195. /*                         !TRY TAKE. */
  196.     if (! takeit_(prsvec_1.prsi, syntax_1.iobj)) {
  197.     return ret_val;
  198.     }
  199. /*                         !TRY TAKE. */
  200.     ret_val = TRUE_;
  201.     return ret_val;
  202.  
  203. } /* synmch_ */
  204.  
  205. /* UNPACK-    UNPACK SYNTAX SPECIFICATION, ADV POINTER */
  206.  
  207. /* DECLARATIONS */
  208.  
  209. static void unpack_(oldj, j)
  210. integer oldj;
  211. integer *j;
  212. {
  213.     /* Local variables */
  214.     integer i;
  215.  
  216.     for (i = 1; i <= 11; ++i) {
  217. /*                         !CLEAR SYNTAX. */
  218.     syn[i - 1] = 0;
  219. /* L10: */
  220.     }
  221.  
  222.     syntax_1.vflag = vvoc[oldj - 1];
  223.     *j = oldj + 1;
  224.     if ((syntax_1.vflag & SDIR) == 0) {
  225.     return;
  226.     }
  227.     syntax_1.dfl1 = -1;
  228. /*                         !ASSUME STD. */
  229.     syntax_1.dfl2 = -1;
  230.     if ((syntax_1.vflag & SSTD) == 0) {
  231.     goto L100;
  232.     }
  233.     syntax_1.dfw1 = -1;
  234. /*                         !YES. */
  235.     syntax_1.dfw2 = -1;
  236.     syntax_1.dobj = VABIT + VRBIT + VFBIT;
  237.     goto L200;
  238.  
  239. L100:
  240.     syntax_1.dobj = vvoc[*j - 1];
  241. /*                         !NOT STD. */
  242.     syntax_1.dfw1 = vvoc[*j];
  243.     syntax_1.dfw2 = vvoc[*j + 1];
  244.     *j += 3;
  245.     if ((syntax_1.dobj & VEBIT) == 0) {
  246.     goto L200;
  247.     }
  248.     syntax_1.dfl1 = syntax_1.dfw1;
  249. /*                         !YES. */
  250.     syntax_1.dfl2 = syntax_1.dfw2;
  251.  
  252. L200:
  253.     if ((syntax_1.vflag & SIND) == 0) {
  254.     return;
  255.     }
  256.     syntax_1.ifl1 = -1;
  257. /*                         !ASSUME STD. */
  258.     syntax_1.ifl2 = -1;
  259.     syntax_1.iobj = vvoc[*j - 1];
  260.     syntax_1.ifw1 = vvoc[*j];
  261.     syntax_1.ifw2 = vvoc[*j + 1];
  262.     *j += 3;
  263.     if ((syntax_1.iobj & VEBIT) == 0) {
  264.     return;
  265.     }
  266.     syntax_1.ifl1 = syntax_1.ifw1;
  267. /*                         !YES. */
  268.     syntax_1.ifl2 = syntax_1.ifw2;
  269. } /* unpack_ */
  270.  
  271. /* SYNEQL-    TEST FOR SYNTAX EQUALITY */
  272.  
  273. /* DECLARATIONS */
  274.  
  275. static logical syneql_(prep, obj, sprep, sfl1, sfl2)
  276. integer prep;
  277. integer obj;
  278. integer sprep;
  279. integer sfl1;
  280. integer sfl2;
  281. {
  282.     /* System generated locals */
  283.     logical ret_val;
  284.  
  285.     if (obj == 0) {
  286.     goto L100;
  287.     }
  288. /*                         !ANY OBJECT? */
  289.     ret_val = prep == (sprep & VPMASK) && (sfl1 & objcts_1.oflag1[
  290.         obj - 1] | sfl2 & objcts_1.oflag2[obj - 1]) != 0;
  291.     return ret_val;
  292.  
  293. L100:
  294.     ret_val = prep == 0 && sfl1 == 0 && sfl2 == 0;
  295.     return ret_val;
  296.  
  297. } /* syneql_ */
  298.  
  299. /* TAKEIT-    PARSER BASED TAKE OF OBJECT */
  300.  
  301. /* DECLARATIONS */
  302.  
  303. static logical takeit_(obj, sflag)
  304. integer obj;
  305. integer sflag;
  306. {
  307.     /* System generated locals */
  308.     logical ret_val;
  309.  
  310.     /* Local variables */
  311.     integer x;
  312.     integer odo2;
  313.  
  314. /* TAKEIT, PAGE 2 */
  315.  
  316.     ret_val = FALSE_;
  317. /*                         !ASSUME LOSES. */
  318.     if (obj == 0 || obj > star_1.strbit) {
  319.     goto L4000;
  320.     }
  321. /*                         !NULL/STARS WIN. */
  322.     odo2 = objcts_1.odesc2[obj - 1];
  323. /*                         !GET DESC. */
  324.     x = objcts_1.ocan[obj - 1];
  325. /*                         !GET CONTAINER. */
  326.     if (x == 0 || (sflag & VFBIT) == 0) {
  327.     goto L500;
  328.     }
  329.     if ((objcts_1.oflag2[x - 1] & OPENBT) != 0) {
  330.     goto L500;
  331.     }
  332.     rspsub_(566, odo2);
  333. /*                         !CANT REACH. */
  334.     return ret_val;
  335.  
  336. L500:
  337.     if ((sflag & VRBIT) == 0) {
  338.     goto L1000;
  339.     }
  340.     if ((sflag & VTBIT) == 0) {
  341.     goto L2000;
  342.     }
  343.  
  344. /* SHOULD BE IN ROOM (VRBIT NE 0) AND CAN BE TAKEN (VTBIT NE 0) */
  345.  
  346.     if (schlst_(0, 0, play_1.here, 0, 0, obj) <= 0) {
  347.     goto L4000;
  348.     }
  349. /*                         !IF NOT, OK. */
  350.  
  351. /* ITS IN THE ROOM AND CAN BE TAKEN. */
  352.  
  353.     if ((objcts_1.oflag1[obj - 1] & TAKEBT) != 0 && (
  354.         objcts_1.oflag2[obj - 1] & TRYBT) == 0) {
  355.     goto L3000;
  356.     }
  357.  
  358. /* NOT TAKEABLE.  IF WE CARE, FAIL. */
  359.  
  360.     if ((sflag & VCBIT) == 0) {
  361.     goto L4000;
  362.     }
  363.     rspsub_(445, odo2);
  364.     return ret_val;
  365.  
  366. /* 1000--    IT SHOULD NOT BE IN THE ROOM. */
  367. /* 2000--    IT CANT BE TAKEN. */
  368.  
  369. L2000:
  370.     if ((sflag & VCBIT) == 0) {
  371.     goto L4000;
  372.     }
  373. L1000:
  374.     if (schlst_(0, 0, play_1.here, 0, 0, obj) <= 0) {
  375.     goto L4000;
  376.     }
  377.     rspsub_(665, odo2);
  378.     return ret_val;
  379. /* TAKEIT, PAGE 3 */
  380.  
  381. /* OBJECT IS IN THE ROOM, CAN BE TAKEN BY THE PARSER, */
  382. /* AND IS TAKEABLE IN GENERAL.  IT IS NOT A STAR. */
  383. /* TAKING IT SHOULD NOT HAVE SIDE AFFECTS. */
  384. /* IF IT IS INSIDE SOMETHING, THE CONTAINER IS OPEN. */
  385. /* THE FOLLOWING CODE IS LIFTED FROM SUBROUTINE TAKE. */
  386.  
  387. L3000:
  388.     if (obj != advs_1.avehic[play_1.winner - 1]) {
  389.     goto L3500;
  390.     }
  391. /*                         !TAKE VEHICLE? */
  392.     rspeak_(672);
  393.     return ret_val;
  394.  
  395. L3500:
  396.     if (x != 0 && objcts_1.oadv[x - 1] == play_1.winner || weight_(0, obj,
  397.          play_1.winner) + objcts_1.osize[obj - 1] <= state_1.mxload) {
  398.     goto L3700;
  399.     }
  400.     rspeak_(558);
  401. /*                         !TOO BIG. */
  402.     return ret_val;
  403.  
  404. L3700:
  405.     newsta_(obj, 559, 0, 0, play_1.winner);
  406. /*                         !DO TAKE. */
  407.     objcts_1.oflag2[obj - 1] |= TCHBT;
  408.     scrupd_(objcts_1.ofval[obj - 1]);
  409.     objcts_1.ofval[obj - 1] = 0;
  410.  
  411. L4000:
  412.     ret_val = TRUE_;
  413. /*                         !SUCCESS. */
  414.     return ret_val;
  415.  
  416. } /* takeit_ */
  417.  
  418. /* GWIM- GET WHAT I MEAN IN AMBIGOUS SITUATIONS */
  419.  
  420. /* DECLARATIONS */
  421.  
  422. static integer gwim_(sflag, sfw1, sfw2)
  423. integer sflag;
  424. integer sfw1;
  425. integer sfw2;
  426. {
  427.     /* System generated locals */
  428.     integer ret_val;
  429.  
  430.     /* Local variables */
  431.     integer av;
  432.     integer nobj, robj;
  433.     logical nocare;
  434.  
  435. /* GWIM, PAGE 2 */
  436.  
  437.     ret_val = -1;
  438. /*                         !ASSUME LOSE. */
  439.     av = advs_1.avehic[play_1.winner - 1];
  440.     nobj = 0;
  441.     nocare = (sflag & VCBIT) == 0;
  442.  
  443. /* FIRST SEARCH ADVENTURER */
  444.  
  445.     if ((sflag & VABIT) != 0) {
  446.     nobj = fwim_(sfw1, sfw2, 0, 0, play_1.winner, nocare);
  447.     }
  448.     if ((sflag & VRBIT) != 0) {
  449.     goto L100;
  450.     }
  451. L50:
  452.     ret_val = nobj;
  453.     return ret_val;
  454.  
  455. /* ALSO SEARCH ROOM */
  456.  
  457. L100:
  458.     robj = fwim_(sfw1, sfw2, play_1.here, 0, 0, nocare);
  459.     if (robj < 0) {
  460.     goto L500;
  461.     } else if (robj == 0) {
  462.     goto L50;
  463.     } else {
  464.     goto L200;
  465.     }
  466. /*                         !TEST RESULT. */
  467.  
  468. /* ROBJ > 0 */
  469.  
  470. L200:
  471.     if (av == 0 || robj == av || (objcts_1.oflag2[robj - 1] & FINDBT)
  472.          != 0) {
  473.     goto L300;
  474.     }
  475.     if (objcts_1.ocan[robj - 1] != av) {
  476.     goto L50;
  477.     }
  478. /*                         !UNREACHABLE? TRY NOBJ */
  479. L300:
  480.     if (nobj != 0) {
  481.     return ret_val;
  482.     }
  483. /*                         !IF AMBIGUOUS, RETURN. */
  484.     if (! takeit_(robj, sflag)) {
  485.     return ret_val;
  486.     }
  487. /*                         !IF UNTAKEABLE, RETURN */
  488.     ret_val = robj;
  489. L500:
  490.     return ret_val;
  491.  
  492. } /* gwim_ */
  493.